{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "查看数据信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting data\\train-images-idx3-ubyte.gz\n",
      "Extracting data\\train-labels-idx1-ubyte.gz\n",
      "Extracting data\\t10k-images-idx3-ubyte.gz\n",
      "Extracting data\\t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"data\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了adam优化器，学习率为0.01。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "# 使用Adam优化器、学习率设置为0.01\n",
    "optimizer = tf.train.AdamOptimizer(\n",
    "    learning_rate=0.001).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.424521, the validation accuracy is 0.9188\n",
      "after 200 training steps, the loss is 0.247922, the validation accuracy is 0.9516\n",
      "after 300 training steps, the loss is 0.16311, the validation accuracy is 0.964\n",
      "after 400 training steps, the loss is 0.218139, the validation accuracy is 0.9696\n",
      "after 500 training steps, the loss is 0.0798199, the validation accuracy is 0.9724\n",
      "after 600 training steps, the loss is 0.143112, the validation accuracy is 0.9692\n",
      "after 700 training steps, the loss is 0.0940168, the validation accuracy is 0.9764\n",
      "after 800 training steps, the loss is 0.146078, the validation accuracy is 0.9786\n",
      "after 900 training steps, the loss is 0.103436, the validation accuracy is 0.972\n",
      "after 1000 training steps, the loss is 0.0656811, the validation accuracy is 0.978\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9808\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, 'model/model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from model\\model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('model')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 主要流程\n",
    "- 加载训练数据\n",
    "- 构建LeNet神经网络模型\n",
    "- 初始化Adam优化器，并计算交叉熵和L2损失函数\n",
    "- 开始训练，1000step\n",
    "- 最终的测试结果，准确率也是蛮不错的，说明模型的训练情况也是很好的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 卷积的特性\n",
    "- 局部相关性\n",
    ">  - 相邻的像素结合起来表达一个特征，距离较远的像素影响较小\n",
    ">  - 随着层数的增加，feature map里面的点映射到原图的感受野越来越大\n",
    ">  - 不仅仅可以适用于图像，其他具有局部相关性的数据均可以尝试卷积网络处理\n",
    ">  - 带来一定的遮挡不变性\n",
    "- 权重共享\n",
    ">  比如一个3*3的卷积核，共9个参数，它会和输入图片的不同区域作卷积，来检测相同的特征。而只有不同的卷积核才会对应不同的权值参数，来检测不同的特征。\n",
    "- 平移不变性\n",
    ">  在任何位置都可以激活神经元\n",
    "- 缩放不变性\n",
    ">  在一定程度内的图像缩放（通常认为25%以内）不会产生太大干扰\n",
    "- 降维\n",
    ">  - 10x10的图像，用5x5的卷积核，采用valid方式（padding=0），stride=2 输出feature map为： floor((10 – 5 + 0 * 2)/2) + 1 = 3 x 3\n",
    ">  - 一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积，那么结果的大小为500 * 500 * 20  \n",
    "- 对输入的尺寸不做要求\n",
    "> - 全连接里面，权重W的尺寸是由输入决定的。\n",
    "> - 卷积核的尺寸只与网络设计有关，与输入没有任何关系\n",
    "> - 卷积核固定的情况下，feature的尺寸是随着输入变化的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 为什么卷积神经网络比全连接神经网络好？\n",
    "- 局部连接 每个神经元不再和上一层的所有神经元相连，而只和一小部分神经元相连。这样就减少了很多参数，权重参数大量减少，大大降低了计算量\n",
    "- 权值共享 一组连接可以共享同一个权重，而不是每个连接有一个不同的权重，这样又减少了很多参数。\n",
    "- 下采样 可以使用Pooling来减少每层的样本数，进一步减少参数数量，同时还可以提升模型的鲁棒性。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
